package top.lishuoboy.dependency.base.json;

import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

/**
 * JSON 工具类
 *
 * @author lishuoboy
 * @date 2022-4-22
 */
@Slf4j
public class HuJsonUtil {
    /** util 默认的 jsonConfig，提供外部使用 */
    public static final JSONConfig defaultJsonConfig = JSONConfig.create()
            .setNatureKeyComparator()       // 启用 Bean按照key名称自然排序。默认未排序
//            .setDateFormat(DatePattern.NORM_DATETIME_MS_PATTERN)  // 设置日期格式，null表示默认的时间戳
            .setIgnoreNullValue(false)      // 忽略null对象。默认true
            .setIgnoreError(true)           // 忽略异常。默认为false
            .setOrder(true)                 // 设置是否有序，顺序按照加入顺序排序，只针对JSONObject有效
            ;

    /** 序列化 */
    public static String toStr(Object obj, JSONConfig jsonConfig) {
        return JSONUtil.toJsonStr(obj, jsonConfig);
    }

    /** 序列化 */
    public static String toStr(Object obj) {
        return toStr(obj, defaultJsonConfig);
    }

    /**
     * 序列化
     *
     * @deprecated 被 <code>toStr(Object obj)</code> 方法替换
     */
    @Deprecated
    public static String toJsonStr(Object obj) {
        return toStr(obj);
    }

    /// 反美化（压缩为一行）
    public static String toStr(String jsonStr, JSONConfig jsonConfig) {
        return JSONUtil.parse(jsonStr, jsonConfig).toString();
    }

    /// 反美化（压缩为一行）
    public static String toStr(String jsonStr) {
        return JSONUtil.parse(jsonStr, defaultJsonConfig).toString();
    }

    /** 序列化并美化 */
    public static String toPrettyStr(Object obj, JSONConfig jsonConfig) {
        return JSONUtil.formatJsonStr(toStr(obj, jsonConfig));  // JSONUtil.toJsonPrettyStr(obj) 不能传参jsonConfig
    }

    /** 序列化并美化 */
    public static String toPrettyStr(Object obj) {
        return toPrettyStr(obj, defaultJsonConfig);
    }

    /**
     * 序列化并美化。同toPrettyStr(Object obj), 因为已被其它项目大量引用，所以保留
     *
     * @deprecated 被 <code>toPrettyStr(Object obj)</code> 方法替换
     */
    @Deprecated
    public static String toJsonPrettyStr(Object obj) {
        return toPrettyStr(obj);
    }

    /** 反序列化为<T> */
    public static <T> T toBean(String jsonStr, Class<T> beanClass) {
        return JSONUtil.toBean(jsonStr, beanClass);
    }

    /** 反序列化为List<T> */
    public static <T> List<T> toList(String jsonStr, TypeReference<List<T>> typeReference) {
        return JSONUtil.toBean(jsonStr, typeReference, false);
    }

    /** 反序列化为List<T> */
    public static <T> List<T> toList(String jsonStr, Class<T> beanClass) {
        return JSONUtil.toList(jsonStr, beanClass);
    }

    /** 反序列化为Map<K, V> */
    public static <K, V> Map<K, V> toMap(String jsonStr, TypeReference<Map<K, V>> typeReference) {
        return JSONUtil.toBean(jsonStr, typeReference.getType(), false);
    }

    /** 反序列化为Map<String, Object> */
    public static Map<String, Object> toMap(String jsonStr) {
        return JSONUtil.toBean(jsonStr, new TypeReference<Map<String, Object>>() {
        }.getType(), false);
    }

    public static void printDefaultFeature() {
        /**
         * {
         *   "dateFormat": null,
         *   "ignoreCase": false,
         *   "ignoreError": false,
         *   "ignoreNullValue": true,
         *   "keyComparator": null,
         *   "order": false,
         *   "stripTrailingZeros": true,
         *   "transientSupport": true
         * }
         */
        log.warn("JSONConfig=={}", HuJsonUtil.toPrettyStr(JSONConfig.create()));
    }
}